Appearance
13. supabase-set-user-role-rpc.sql
원본 파일: 'C:\Repository\loafacto-hub\docs\web-ui\13. supabase-set-user-role-rpc.sql'
sql
-- =============================================================================
-- 관리자용: 사용자 역할 변경 RPC (관리자 / 운영자 / 사용자)
-- user_roles 적용 후, Supabase SQL Editor에서 실행하세요.
-- 호출자: super_admin 또는 operator. super_admin으로 설정하려면 호출자가 super_admin이어야 함.
-- p_new_role: 'super_admin' | 'operator' | 'user'. 'user'이면 user_roles 행 삭제(일반 사용자).
-- =============================================================================
CREATE OR REPLACE FUNCTION public.set_user_role(p_target_user_id uuid, p_new_role text)
RETURNS jsonb
LANGUAGE plpgsql
SECURITY DEFINER
SET search_path = public
AS $$
DECLARE
v_caller_role text;
BEGIN
-- 호출자 역할 조회 (super_admin 또는 operator만 허용)
SELECT role INTO v_caller_role
FROM public.user_roles
WHERE user_id = auth.uid()
LIMIT 1;
IF v_caller_role IS NULL THEN
RETURN jsonb_build_object('ok', false, 'error', 'unauthorized');
END IF;
IF p_new_role NOT IN ('super_admin', 'operator', 'user') THEN
RETURN jsonb_build_object('ok', false, 'error', 'invalid_role');
END IF;
-- super_admin으로 설정하려면 호출자 본인이 super_admin이어야 함
IF p_new_role = 'super_admin' AND v_caller_role <> 'super_admin' THEN
RETURN jsonb_build_object('ok', false, 'error', 'only_super_admin_can_assign');
END IF;
IF p_new_role = 'user' THEN
DELETE FROM public.user_roles WHERE user_id = p_target_user_id;
RETURN jsonb_build_object('ok', true);
END IF;
-- super_admin 또는 operator로 설정: upsert
INSERT INTO public.user_roles (user_id, role, updated_at)
VALUES (p_target_user_id, p_new_role, now())
ON CONFLICT (user_id) DO UPDATE SET
role = EXCLUDED.role,
updated_at = EXCLUDED.updated_at;
RETURN jsonb_build_object('ok', true);
END;
$$;
COMMENT ON FUNCTION public.set_user_role(uuid, text) IS '관리자(super_admin/operator)만 호출. 대상 사용자 역할을 관리자/운영자/사용자로 변경. super_admin 지정은 super_admin만 가능.';
GRANT EXECUTE ON FUNCTION public.set_user_role(uuid, text) TO authenticated;